// 将扁平化数据转换成树形结构数据
export function tranTree(list) {
  // 入参 list：就是要转换的扁平化数据

  // 定义转换后的树形数据
  const treeList = []

  // 具体的转换工作

  // 转换思路：
  // 转换过程其实就是孩子寻找父亲的过程：
  //   1. 遍历扁平化数组
  //   2. 用数组中的某一项的 pid，去匹配另外一项的 id，如果相等，表示
  //      匹配到的就是父亲，就把自己加入到父亲的 children 里面。

  // 双重循环时间复杂度比较高，代码逻辑比较复杂难以理解
  // list.forEach(item => {
  //   item.pid 
  //   list.forEach(item2 => {
  //     if (item.pid === item2.id) {}
  //   })
  // })

  // 为了更加方便的去寻找 id，我们要创建一个 id 和 item 的映射关系。
  // 扁平化数据 = [
  //   { id: "1175311373083017216", pid: "", name: "技术部" },
  //   { id: "1235398608847052800", pid: "1175311373083017216", name: "Java研发部" },
  //   { id: "1235398661355544576", pid: "1175311373083017216", name: "Python研发部" },
  //   { id: "1235398708763762688", pid: "1175311373083017216", name: "Php研发部" }
  // ]

  // obj[id]
  // id和item的映射关系obj = {
  //   "id": item
  //   "1175311373083017216": { id: "1175311373083017216", pid: "", name: "技术部", children: [
  //     {name: 'Java'},
  //     {name: 'Python'},
  //     {name: 'Php'}
  // ] },
  //   "1235398608847052800": { id: "1235398608847052800", pid: "1175311373083017216", name: "Java研发部" },
  //   "1235398661355544576": { id: "1235398661355544576", pid: "1175311373083017216", name: "Python研发部" },
  //   "1235398708763762688": { id: "1235398708763762688", pid: "1175311373083017216", name: "Php研发部" }
  // }
  const obj = {}
  list.forEach(item => {
    obj[item.id] = item
  })
  // console.log(obj);

  // 真正的数据转换工作
  list.forEach(item => {
    if (obj[item.pid]) {
      // 找到了父亲
      // item 是自己
      // obj[item.pid] 是父亲
      // 如果父亲还没有 children，我们需要手动为父亲添加一个 children 属性，值为空数组
      if (!obj[item.pid].children) obj[item.pid].children = []
      // 将自己添加到父亲的 children 里面
      obj[item.pid].children.push(item)
      // 注意：
      // 映射关系中的 item 和扁平化数据中的 item 是同一个引用。
      // 给映射关系中的 item 添加 children 属性，就相当于给扁平化数据的 item 添加 children 属性
    } else {
      // 没找到父亲
      treeList.push(item)
    }
  })
  // 返回值：就是转换后的树形结构数据
  return treeList
}

// 递归：函数调用自己
// recursion() {
//   // 1. 递归终止条件
//   // 2. 处理当前层逻辑（要找到重复做的事情）
//   // 3. 下钻到下一层
// }
// 使用递归实现树形数据的转换
export function recurTransTree(list, id) {
  // 入参 list：就是要转换的扁平化数据
  // 入参 id：每次要找孩子的那个父节点 id

  // child：用于收集本次递归找到的所有的孩子
  const child = []

  // 转换工作
  // 遍历扁平化数组数据，开始收集孩子
  list.forEach(item => {
    // 递归终止条件
    if (item.pid === id) {
      // 处理当前层逻辑（要找到重复做的事情）
      // 如果某条数据的 pid 等于传递进来的父节点 id，说明该条数据是父节点的孩子，把它放入到收集孩子的数组中
      child.push(item)
      // 下钻到下一层
      // 继续递归，以该数据为父节点，去收集它的孩子
      const children = recurTransTree(list, item.id)
      // 如果收集到了 item 的孩子，再给 item 添加 children 属性
      if (children.length) item.children = children
    }
  })

  // 返回值 child：本次递归找到的所有的孩子
  return child
}
